/**************************************************************************
  * @brief         : 定时器0 使用示例
  * @author        : 陈春  
  * @copyright     : SparkStudio星源科创工作室
  * @version       : V1.0
  * @note          :  
  * @history       :  
					2023年11月1日 初始版本：定时器0及中断使用
***************************************************************************/

#include "STC8A8K64D4.H"

#define FOSC 1105920000UL  //主时钟11.0592MHz,本定义用于定时初值计算等，需要根据实际更改

sbit LED0=P2^1;
sbit LED1=P2^2;


unsigned char TO_Flag;

/**************************************************************************
  * @brief        : 开启中断的定时器0初始化--12T模式（sysclk/12）16位自动重载
  * @param[in]    : T0Value:定时中断时长，单位ms，取值范围：1-50ms;
					ET0_en:定时器中断开启使能
  * @param[out]   : 无
  * @return      	: 无
  * @others       : 其它
***************************************************************************/
void Timer0_Init(unsigned char T0_ms,unsigned char ET0_en)
{
	AUXR &= 0x7F;			//定时器时钟12T模式
	TMOD &= 0xF0;			//设置定时器模式 
	TL0 = (65536-T0_ms*1000*FOSC/12);				//设置定时初始值
	TH0 = (65536-T0_ms*1000*FOSC/12)>>8;				//设置定时初始值
	TF0 = 0;				  //清除TF0标志
	TR0 = 1;				  //定时器0开始计时
	//if(ET0_en!=0)ET0=1;else ET0=0;
	ET0= (ET0_en!=0) ? 1:0;
}


/**************************************************************************
  * @brief        : IO口工作模式初始化，默认设置将用到的端口设置为准双向口
  * @param[in]    : 无
										
  * @param[out]   : 无
  * @return      	: 无
  * @others       : 其它
***************************************************************************/
void GPIO_Init(void)
{
		P2M0=0; //P2端口设置为准双向口
		P2M1=0;
}


void main()
{
	GPIO_Init();
	Timer0_Init(50,1);
	EA=1;   //开启全局中断
	while(1)
	{
		if(TO_Flag)
		{
			LED1=~LED1;
			TO_Flag=0;// 任务处理完后复位
		}
	}
}
//定时器任务：LED0每1秒闪一次，LED1则2秒闪一次，两者的实现逻辑不同
void Timer0_ISR(void) interrupt 1
{
	static unsigned char T0_cnt;
	
	if(++T0_cnt==10)
	{
		LED0=~LED0;		 
	}
	else if(T0_cnt==20)
	{
		TO_Flag=1;	
		T0_cnt=0;		
	}
		
	
}